//
//  YHLocalNotificationManager.swift
//  YHKit
//
//  Created by amovision on 2025/10/13.
//

import UIKit
import UserNotifications

public class YHLocalNotificationManager {
  public static let shared = YHLocalNotificationManager()
    
  private init() {}
    
  /// 请求用户授权发送通知
  /// 建议在 App 启动时（如 AppDelegate 或 SceneDelegate）调用此方法
  public func requestAuthorization() {
    let center = UNUserNotificationCenter.current()
    center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
      if let error = error {
        print("请求通知授权时出错: \(error.localizedDescription)")
      }
            
      if granted {
        print("通知授权成功")
      } else {
        print("用户拒绝了通知授权")
      }
    }
  }
    
  /// 封装的发送本地通知方法
  ///
  /// - Parameters:
  ///   - title: 通知的主标题
  ///   - subtitle: 通知的副标题
  ///   - body: 通知的主体内容 (默认为空字符串)
  ///   - timeInterval: 延迟多少秒后触发通知 (默认为 5 秒)
  ///   - sound: 通知声音 (默认为系统默认声音)
  ///   - completion: 操作完成后的回调，返回可能发生的错误
  public func scheduleNotification(
    title: String,
    subtitle: String,
    body: String = "",
    timeInterval: TimeInterval = 5,
    sound: UNNotificationSound = .default,
    completion: ((Error?) -> Void)? = nil
  ) {
    let center = UNUserNotificationCenter.current()
        
    // 1. 创建通知内容 (Content)
    let content = UNMutableNotificationContent()
    content.title = title
    content.subtitle = subtitle
    content.body = body
    content.sound = sound
    // 你还可以设置角标等
    // content.badge = 1
        
    // 2. 创建触发器 (Trigger)
    // 确保 timeInterval 大于 0，否则会崩溃
    guard timeInterval > 0 else {
      print("错误：timeInterval 必须大于 0")
      // 你也可以在这里处理错误回调
      return
    }
    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: timeInterval, repeats: false)
        
    // 3. 创建通知请求 (Request)
    // 使用 UUID 作为唯一标识符，以防多个通知冲突
    let request = UNNotificationRequest(
      identifier: UUID().uuidString,
      content: content,
      trigger: trigger
    )
        
    // 4. 将请求添加到通知中心
    center.add(request) { error in
      DispatchQueue.main.async {
        if let error = error {
          print("添加通知失败: \(error.localizedDescription)")
          completion?(error)
        } else {
          print("通知已成功计划！标题: '\(title)', 副标题: '\(subtitle)'")
          completion?(nil)
        }
      }
    }
  }
    
  /// 取消所有待处理的通知
  public func cancelAllPendingNotifications() {
    let center = UNUserNotificationCenter.current()
    center.removeAllPendingNotificationRequests()
    print("所有待处理的通知已被取消")
  }
}
